package org.locker.scheduling;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.locker.domain.Order;
import org.locker.domain.enums.OrderStatusEnum;
import org.locker.service.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @Description: 订单定时器
 * @Author: lark
 * @Date: 2023-10-30
 */
@Slf4j
@Component
public class OrderScheduledTasks {

    @Autowired
    private IOrderService orderService;

    @Scheduled(fixedRate = 300000)
    public void executeTask() {
        /**
         * 待支付的订单超过五分钟自动取消
         */
        // 获取当前时间减去五分钟的时间
        LocalDateTime fiveMinutesAgo = LocalDateTime.now().minusMinutes(5);
        orderService.update(Wrappers.<Order>lambdaUpdate()
            .set(Order::getOrderStatus, OrderStatusEnum.ORDER_CANCELLED.getCode())
            .eq(Order::getOrderStatus, OrderStatusEnum.WAITING_FOR_PAYMENT.getCode())
            .lt(Order::getCreateTime, fiveMinutesAgo));
    }

    @Scheduled(cron = "0 0 1,12,22 * * ?")
    public void orderSettlementTask() {
        orderService.orderSettlement();
    }


    @Scheduled(cron = "0 0 3 * * ?") // 每天4点执行一次
    public void orderFinished() {
        log.info("每天定时，执行订单结束，但是不开锁");
        orderService.orderFinished();
    }


    /**
     * 1.用户端显示的订单数据只显示3天以内的。 2.余额超过3天之后，默认显示为0.就是最后一个订单要是超过当前时间3天了，就显示为0吧。 超过时间后,用户自己无法正常提现，客服在后台可以操作给他提现。
     */
    @Scheduled(fixedRate = 30 * 60 * 1000)
    public void userOrderOverThreeDay() {
        orderService.userOrderOverThreeDay();
    }




    @Scheduled(fixedRate = 30 * 60 * 1000)
    public void spiltTaskQuery() {
            orderService.spiltTaskQuery();
    }


    @Scheduled(cron = "0 0 1 * * ?") // 每天4点执行一次
    @Async
    public void orderStatistics() {
        log.info("每天1点统计订单");
        orderService.orderStatistics();
    }
}
